home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Arashi 1.1.1 / source code / For your think c folder / VA Kit ƒ / VALines.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-09  |  9.0 KB  |  365 lines  |  [TEXT/KAHL]

  1. /*/
  2.      Project Arashi: VALines.c
  3.      Major release: Version 1.1d2, 9/5/95
  4.  
  5.      Last modification: Wednesday, September 9, 1992, 21:42
  6.      Created: Thursday, February 9, 1989, 15:32
  7.  
  8.      Copyright © 1989-1992, Juri Munkki
  9. /*/
  10.  
  11. #include "VA.h"
  12. #include "VAInternal.h"
  13.  
  14. void    VADrawBufferedLines(count,lines,colors)
  15. int        count;
  16. Rect    *lines;
  17. int        *colors;
  18. {
  19. asm    {
  20.     movem.l    D3-D7/A2-A3,-(sp)
  21.  
  22.     move.l    lines,A3
  23.     move.l    colors,A2
  24.     sub.w    #1,count
  25.     bmi        @exitreally
  26. @bigloop
  27.  
  28.     move.w    (A3)+,D2    ;    Y1 to D2
  29.     move.w    (A3)+,D0    ;    X1 to D0
  30.     move.w    (A3)+,D3    ;    Y2 to D3
  31.     move.w    (A3)+,D1    ;    X2 to D1
  32.  
  33.     cmp.w    D1,D0        ;    Is X1<X2
  34.     blt.s    @right        ;    Yes
  35.     exg.l    D0,D1        ;    Swap X1 and X2
  36.     exg.l    D2,D3        ;    Swap Y1 and Y2
  37. @right
  38.  
  39.     move.w    D1,D6
  40.     sub.w    D0,D6        ;    DeltaX to D6
  41.  
  42.     move.w    D3,D7
  43.     sub.w    D2,D7        ;    DeltaY to D7
  44.     bpl.s    @delta2
  45.     neg.w    D7            ;    Abs DeltaY
  46. @delta2
  47.     move.w    VA.row,D4    ;    VA.row into D4
  48.     move.l    VA.quickrow,A1        ;    Pointer to base address table
  49.     move.l    (0,A1,D2.w*4),A0    ;    Get pointer to row base
  50.     add.w    D0,A0        ;    Add X1 to base address
  51.  
  52.     move.l    (0,A1,D3.w*4),A1
  53.     add.w    D1,A1
  54.  
  55.     cmp.w    D3,D2        ;    is Y1<Y2
  56.     blt.s    @down        ;    Yes, direction is down
  57.     neg.w    D4            ;    No, direction is up
  58. @down
  59.     ext.l    D4            ;    Sign extend D4
  60.     move.l    VA.offset,D0;    D0 is offset from byte boundary.
  61.     
  62.     move.w    (A2)+,D1    ;    Copy colorvalue to D1
  63.     move.w    VA.field,D5    ;    Field width to D5
  64.     cmp.w    D6,D7        ;    is DeltaY>=DeltaX?
  65.     bge        @vertigo    ;    Yes, jump
  66.  
  67.     move.w    D6,D2        ;    ErrorAcc=DeltaX
  68.     asr.w    #1,D2        ;    ErrorAcc=DeltaX/2
  69.     move.w    D2,D3        ;    DeltaX/2 is loop counter
  70. @xplot
  71.     subq.w    #8,D3        ;    Subtract 8 from loopcount
  72.     bmi        @xshort        ;    Should we fall out?
  73.  
  74.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  75.     addq.l    #1,A0        ;    Advance to next x pixel
  76.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  77.     subq.l    #1,A1
  78.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  79.     bpl.s    @xnext1        ;    No acc overflow
  80.     add.l    D4,A0        ;    Move RowBase to next line
  81.     sub.l    D4,A1
  82.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  83. @xnext1
  84.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  85.     addq.l    #1,A0        ;    Advance to next x pixel
  86.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  87.     subq.l    #1,A1
  88.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  89.     bpl.s    @xnext2        ;    No acc overflow
  90.     add.l    D4,A0        ;    Move RowBase to next line
  91.     sub.l    D4,A1
  92.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  93. @xnext2
  94.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  95.     addq.l    #1,A0        ;    Advance to next x pixel
  96.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  97.     subq.l    #1,A1
  98.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  99.     bpl.s    @xnext3        ;    No acc overflow
  100.     add.l    D4,A0        ;    Move RowBase to next line
  101.     sub.l    D4,A1
  102.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  103. @xnext3
  104.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  105.     addq.l    #1,A0        ;    Advance to next x pixel
  106.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  107.     subq.l    #1,A1
  108.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  109.     bpl.s    @xnext4        ;    No acc overflow
  110.     add.l    D4,A0        ;    Move RowBase to next line
  111.     sub.l    D4,A1
  112.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  113. @xnext4
  114.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  115.     addq.l    #1,A0        ;    Advance to next x pixel
  116.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  117.     subq.l    #1,A1
  118.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  119.     bpl.s    @xnext5        ;    No acc overflow
  120.     add.l    D4,A0        ;    Move RowBase to next line
  121.     sub.l    D4,A1
  122.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  123. @xnext5
  124.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  125.     addq.l    #1,A0        ;    Advance to next x pixel
  126.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  127.     subq.l    #1,A1
  128.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  129.     bpl.s    @xnext6        ;    No acc overflow
  130.     add.l    D4,A0        ;    Move RowBase to next line
  131.     sub.l    D4,A1
  132.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  133. @xnext6
  134.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  135.     addq.l    #1,A0        ;    Advance to next x pixel
  136.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  137.     subq.l    #1,A1
  138.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  139.     bpl.s    @xnext7        ;    No acc overflow
  140.     add.l    D4,A0        ;    Move RowBase to next line
  141.     sub.l    D4,A1
  142.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  143. @xnext7
  144.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  145.     addq.l    #1,A0        ;    Advance to next x pixel
  146.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  147.     subq.l    #1,A1
  148.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  149.     bpl        @xplot        ;    No acc overflow
  150.     add.l    D4,A0        ;    Move RowBase to next line
  151.     sub.l    D4,A1
  152.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  153. @xnext8
  154.     bra        @xplot
  155. @xshort
  156.     addq.w    #8,D3
  157. @xplot2
  158.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  159.     addq.l    #1,A0        ;    Advance to next x pixel
  160.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  161.     subq.l    #1,A1
  162.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  163.     bpl.s    @xnext        ;    No acc overflow
  164.     add.l    D4,A0        ;    Move RowBase to next line
  165.     sub.l    D4,A1
  166.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  167. @xnext
  168.     dbra    D3,@xplot2    ;    Loop...
  169.     bra        @exit
  170.     
  171. @vertigo
  172.     move.w    D7,D2        ;    ErrorAcc=DeltaY
  173.     asr.w    #1,D2        ;    ErrorAcc=DeltaY/2
  174.     move.w    D2,D3        ;    DeltaY/2 is loop counter
  175. @yplot
  176.     subq.w    #8,D3
  177.     bmi        @yshort
  178.  
  179.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  180.     add.l    D4,A0        ;    Move RowBase to next line
  181.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  182.     sub.l    D4,A1        ;    Move RowBase to next line
  183.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  184.     bpl.s    @ynext1        ;    No acc overflow
  185.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  186.     addq.l    #1,A0        ;    Advance to next x pixel
  187.     subq.l    #1,A1
  188. @ynext1
  189.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  190.     add.l    D4,A0        ;    Move RowBase to next line
  191.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  192.     sub.l    D4,A1        ;    Move RowBase to next line
  193.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  194.     bpl.s    @ynext2        ;    No acc overflow
  195.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  196.     addq.l    #1,A0        ;    Advance to next x pixel
  197.     subq.l    #1,A1
  198. @ynext2
  199.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  200.     add.l    D4,A0        ;    Move RowBase to next line
  201.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  202.     sub.l    D4,A1        ;    Move RowBase to next line
  203.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  204.     bpl.s    @ynext3        ;    No acc overflow
  205.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  206.     addq.l    #1,A0        ;    Advance to next x pixel
  207.     subq.l    #1,A1
  208. @ynext3
  209.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  210.     add.l    D4,A0        ;    Move RowBase to next line
  211.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  212.     sub.l    D4,A1        ;    Move RowBase to next line
  213.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  214.     bpl.s    @ynext4        ;    No acc overflow
  215.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  216.     addq.l    #1,A0        ;    Advance to next x pixel
  217.     subq.l    #1,A1
  218. @ynext4
  219.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  220.     add.l    D4,A0        ;    Move RowBase to next line
  221.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  222.     sub.l    D4,A1        ;    Move RowBase to next line
  223.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  224.     bpl.s    @ynext5        ;    No acc overflow
  225.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  226.     addq.l    #1,A0        ;    Advance to next x pixel
  227.     subq.l    #1,A1
  228. @ynext5
  229.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  230.     add.l    D4,A0        ;    Move RowBase to next line
  231.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  232.     sub.l    D4,A1        ;    Move RowBase to next line
  233.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  234.     bpl.s    @ynext6        ;    No acc overflow
  235.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  236.     addq.l    #1,A0        ;    Advance to next x pixel
  237.     subq.l    #1,A1
  238. @ynext6
  239.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  240.     add.l    D4,A0        ;    Move RowBase to next line
  241.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  242.     sub.l    D4,A1        ;    Move RowBase to next line
  243.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  244.     bpl.s    @ynext7        ;    No acc overflow
  245.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  246.     addq.l    #1,A0        ;    Advance to next x pixel
  247.     subq.l    #1,A1
  248. @ynext7
  249.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  250.     add.l    D4,A0        ;    Move RowBase to next line
  251.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  252.     sub.l    D4,A1        ;    Move RowBase to next line
  253.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  254.     bpl        @yplot        ;    No acc overflow
  255.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  256.     addq.l    #1,A0        ;    Advance to next x pixel
  257.     subq.l    #1,A1
  258.  
  259.     bra        @yplot
  260. @dot
  261.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  262.     bra.s    @exit
  263. @yshort
  264.     addq.l    #8,D3
  265. @yplot2
  266.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  267.     add.l    D4,A0        ;    Move RowBase to next line
  268.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  269.     sub.l    D4,A1        ;    Move RowBase to next line
  270.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  271.     bpl.s    @ynext        ;    No acc overflow
  272.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  273.     addq.l    #1,A0        ;    Advance to next x pixel
  274.     subq.l    #1,A1
  275. @ynext
  276.     dbra    D3,@yplot2    ;    Loop...
  277.     
  278. @exit
  279.     sub.w    #1,count
  280.     bpl        @bigloop
  281. @exitreally
  282.     movem.l    (sp)+,D3-D7/A2-A3
  283.     }
  284. }
  285.  
  286.  
  287. void    VALineTo(x,y)
  288. int        x,y;
  289. {
  290.     register    Rect    *p;
  291.  
  292.     if(VA.numlines[VA.curbuffer]<MAXSAVED)
  293.     {    VA.linecolors[VA.curbuffer][VA.numlines[VA.curbuffer]]=VA.color;
  294.         p=VA.lines[VA.curbuffer]+VA.numlines[VA.curbuffer]++;
  295.         p->top=VA.CurrentY;
  296.         p->left=VA.CurrentX;
  297.         p->bottom=y;
  298.         p->right=x;
  299.     }
  300.     VA.CurrentX=x;
  301.     VA.CurrentY=y;
  302. }
  303. void    VASafeLineTo(x,y)
  304. int        x,y;
  305. {
  306.     register    Rect    *p;
  307.     register    int        flag;
  308.     
  309. asm    {
  310.         moveq.l    #0,flag
  311.  
  312.         move.w    x,D0
  313.         cmp.w    VA.frame.left,D0
  314.         blt.s    @outside
  315.         cmp.w    VA.frame.right,D0
  316.         bge.s    @outside
  317.  
  318.         move.w    y,D0
  319.         cmp.w    VA.frame.top,D0
  320.         blt.s    @outside
  321.         cmp.w    VA.frame.bottom,D0
  322.         bge.s    @outside
  323.         
  324.         move.w    VA.CurrentX,D0
  325.         cmp.w    VA.frame.left,D0
  326.         blt.s    @outside
  327.         cmp.w    VA.frame.right,D0
  328.         bge.s    @outside
  329.  
  330.         move.w    VA.CurrentY,D0
  331.         cmp.w    VA.frame.top,D0
  332.         blt.s    @outside
  333.         cmp.w    VA.frame.bottom,D0
  334.         bge.s    @outside
  335.  
  336.         moveq.l    #-1,flag
  337. @outside
  338.     }
  339.     if(flag)
  340.     if(VA.numlines[VA.curbuffer]<MAXSAVED)
  341.     {    VA.linecolors[VA.curbuffer][VA.numlines[VA.curbuffer]]=VA.color;
  342.         p=VA.lines[VA.curbuffer]+VA.numlines[VA.curbuffer]++;
  343.         p->top=VA.CurrentY;
  344.         p->left=VA.CurrentX;
  345.         p->bottom=y;
  346.         p->right=x;
  347.     }
  348.     VA.CurrentX=x;
  349.     VA.CurrentY=y;
  350. }
  351. void    VALine(x1,y1,x2,y2)
  352. int        x1,y1,x2,y2;
  353. {
  354.     register    Rect    *p;
  355.     
  356.     if(VA.numlines[VA.curbuffer]<MAXSAVED)
  357.     {    VA.linecolors[VA.curbuffer][VA.numlines[VA.curbuffer]]=VA.color;
  358.         p=VA.lines[VA.curbuffer]+VA.numlines[VA.curbuffer]++;
  359.         p->top=y1;
  360.         p->left=x1;
  361.         p->bottom=y2;
  362.         p->right=x2;
  363.     }
  364. }
  365.